home *** CD-ROM | disk | FTP | other *** search
- /**
- * Scout - The Amiga System Monitor
- *
- *------------------------------------------------------------------
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * You must not use this source code to gain profit of any kind!
- *
- *------------------------------------------------------------------
- *
- * @author Andreas Gelhausen
- * @author Richard Körber <rkoerber@gmx.de>
- */
-
- #include "system_headers.h"
-
- struct LongFlag taskFlags[] = {
- { TF_PROCTIME, "TF_PROCTIME", "%00000001" },
- { TF_ETASK, "TF_ETASK", "%00001000" },
- { TF_STACKCHK, "TF_STACKCHK", "%00010000" },
- { TF_EXCEPT, "TF_EXCEPT", "%00100000" },
- { TF_SWITCH, "TF_SWITCH", "%01000000" },
- { TF_LAUNCH, "TF_LAUNCH", "%10000000" },
- { 0, NULL, NULL }
- };
-
- struct LongFlag processFlags[] = {
- { PRF_FREESEGLIST, "PRF_FREESEGLIST", "$00000001" },
- { PRF_FREECURRDIR, "PRF_FREECURRDIR", "$00000002" },
- { PRF_FREECLI, "PRF_FREECLI", "$00000004" },
- { PRF_CLOSEINPUT, "PRF_CLOSEINPUT", "$00000008" },
- { PRF_CLOSEOUTPUT, "PRF_CLOSEOUTPUT", "$00000010" },
- { PRF_FREEARGS, "PRF_FREEARGS", "$00000020" },
- { 0, NULL, NULL }
- };
-
- static __asm __saveds LONG seglist_con2func(register __a2 Object *obj, register __a1 struct NList_ConstructMessage *msg, register __a0 struct Hook *hook)
- {
- return AllocListEntry(msg->pool, msg->entry, sizeof(struct SegListEntry));
- }
-
- MakeHook(seglist_con2hook, seglist_con2func);
-
- static __asm __saveds LONG seglist_des2func(register __a2 Object *obj, register __a1 struct NList_DestructMessage *msg, register __a0 struct Hook *hook)
- {
- FreeListEntry(msg->pool, &msg->entry);
-
- return 0;
- }
-
- MakeHook(seglist_des2hook, seglist_des2func);
-
- static __asm __saveds LONG seglist_dsp2func(register __a2 Object *obj, register __a1 struct NList_DisplayMessage *msg, register __a0 struct Hook *hook)
- {
- struct SegListEntry *sle = (struct SegListEntry *)msg->entry;
-
- if (sle) {
- msg->strings[0] = sle->sle_Lower;
- msg->strings[1] = sle->sle_Upper;
- msg->strings[2] = sle->sle_Size;
- } else {
- msg->strings[0] = "Lower";
- msg->strings[1] = "Upper";
- msg->strings[2] = "Size";
- msg->preparses[0] = MUIX_B;
- msg->preparses[1] = MUIX_B;
- msg->preparses[2] = MUIX_B;
- }
-
- return 0;
- }
-
- MakeHook(seglist_dsp2hook, seglist_dsp2func);
-
- static LONG seglist_cmp2colfunc( struct SegListEntry *sle1,
- struct SegListEntry *sle2,
- ULONG column )
- {
- switch (column) {
- case 0: return stricmp(sle1->sle_Lower, sle2->sle_Lower);
- case 1: return stricmp(sle1->sle_Upper, sle2->sle_Upper);
- case 2: return stricmp(sle1->sle_Size, sle2->sle_Size);
- }
- }
-
- __asm __saveds LONG seglist_cmp2func(register __a2 Object *obj, register __a1 struct NList_CompareMessage *msg, register __a0 struct Hook *hook)
- {
- LONG cmp;
- struct SegListEntry *sle1, *sle2;
- ULONG col1, col2;
-
- sle1 = (struct SegListEntry *)msg->entry1;
- sle2 = (struct SegListEntry *)msg->entry2;
- col1 = msg->sort_type & MUIV_NList_TitleMark_ColMask;
- col2 = msg->sort_type2 & MUIV_NList_TitleMark2_ColMask;
-
- if (msg->sort_type == MUIV_NList_SortType_None) return 0;
-
- if (msg->sort_type & MUIV_NList_TitleMark_TypeMask) {
- cmp = seglist_cmp2colfunc(sle2, sle1, col1);
- } else {
- cmp = seglist_cmp2colfunc(sle1, sle2, col1);
- }
-
- if (cmp != 0 || col1 == col2) return cmp;
-
- if (msg->sort_type2 & MUIV_NList_TitleMark2_TypeMask) {
- cmp = seglist_cmp2colfunc(sle2, sle1, col2);
- } else {
- cmp = seglist_cmp2colfunc(sle1, sle2, col2);
- }
-
- return cmp;
- }
-
- MakeHook(seglist_cmp2hook, seglist_cmp2func);
-
- static void SetDetails( struct IClass *cl,
- Object *obj,
- struct TaskEntry *te )
- {
- struct TasksDetailWinData *tdwd = INST_DATA(cl, obj);
- struct Task *task = te->te_Addr;
- struct Process *proc = (struct Process *)te->te_Addr;
- UBYTE tcflags[16];
-
- Flags2BinStr(task->tc_Flags, tcflags, sizeof(tcflags));
-
- if (task->tc_Node.ln_Type == NT_PROCESS) {
- APTR add,processmoretext0,processmoretext1a,processmoretext1b,processmoretext2,processmoretext3;
- APTR processmoretext4,processmoretext5,processmoretext6a,processmoretext6b,processmoretext7,seglist;
- LONG *seg;
- struct MinList tmplist;
- struct SegListEntry *sle, *_sle;
-
- Child, add = HGroup,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, MyLabel2("Name:"),
- Child, MyLabel2("Address:\nIDNestCnt:\nTrapAlloc:\nTrapAble:\nTrapData:\nTrapCode:\nUserData:"),
- Child, MyLabel2("Flags:"),
- Child, MyLabel2("Pad:\nGlobVec:\nResult2:\nCOS:\nCLI:\nWindowPtr:"),
- Child, MyLabel2("\nHunks:\n\n\n\n"),
- Child, MyVSpace(0),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, processmoretext0 = MyTextObject(),
- Child, HGroup,
- Child, VGroup,
- Child, HGroup,
- Child, VGroup, MUIA_Group_SameWidth, TRUE, MUIA_Weight, 0,
- Child, processmoretext1a = MyTextObject(),
- Child, processmoretext1b = MakeButton(""),
- Child, processmoretext4 = MyTextObject(),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE, MUIA_Weight, 60,
- Child, MyLabel("State:\nTDNestCnt:\nExceptData:\nExceptCode:\nStackSize:\nSPLower:\nSPUpper:\nSPReg:"),
- Child, MyVSpace(0),
- Child, MyLabel("SegList:\nTaskNum:\nCurrentDir:\nConsoleTask:\nReturnAddr:\nHomeDir:"),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, processmoretext2 = MyTextObject2(),
- Child, MyVSpace(0),
- Child, processmoretext5 = MyTextObject2(),
- End,
- End,
- Child, MyVSpace(2),
- Child, seglist = MyNListviewObject(MakeID('S','L','L','V'), "BAR,BAR,BAR P=" MUIX_R, &seglist_con2hook, &seglist_des2hook, &seglist_dsp2hook, &seglist_cmp2hook, FALSE),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE, MUIA_Weight, 60,
- Child, MyLabel("Pri:\nSigAlloc:\nSigWait:\nSigRecvd:\nSigExcept:\nSwitch():\nLaunch():\nMemEntry:"),
- Child, MyLabel("Flags:"),
- Child, MyLabel("StackSize:\nStackBase:\nCIS:\nFileSystemTask:\nPktWait:"),
- Child, MyLabel("ExitCode:\nExitData:\nArguments:\nLocalVars:\nShellPrivate:\nCES:"),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, processmoretext3 = MyTextObject2(),
- Child, processmoretext6b = MakeButton(""),
- Child, processmoretext6a = MyTextObject2(),
- Child, processmoretext7 = MyTextObject2(),
- End,
- End,
- End,
- End;
-
- DoMethod(tdwd->tdwd_MainGroup, MUIM_Group_InitChange);
- DoMethod(tdwd->tdwd_MainGroup, OM_ADDMEMBER, add);
- DoMethod(tdwd->tdwd_MainGroup, MUIM_Group_ExitChange);
-
- DoMethod(processmoretext1b, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_TasksDetailWin_TaskFlagsMore);
- DoMethod(processmoretext6b, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_TasksDetailWin_ProcessFlagsMore);
-
- set(obj, MUIA_Window_ActiveObject, processmoretext1b);
-
- MySetContents(processmoretext0, "%s", te->te_Name);
- MySetContents(processmoretext1a, MUIX_R " $%08lx\n%lD\n$%04lx\n$%04lx\n $%08lx\n $%08lx\n $%08lx", task, task->tc_IDNestCnt, task->tc_TrapAlloc, task->tc_TrapAble, task->tc_TrapData, task->tc_TrapCode, task->tc_UserData);
- MySetContents(processmoretext1b, MUIX_B "%s", tcflags);
- MySetContents(processmoretext2, MUIX_C "%s\n" MUIX_R "%lD\n$%08lx\n$%08lx\n%lD\n$%08lx\n$%08lx\n$%08lx", GetTaskState((BYTE)task->tc_State, task->tc_SigWait), task->tc_TDNestCnt, task->tc_ExceptData, task->tc_ExceptCode, (char *)task->tc_SPUpper - (char *)task->tc_SPLower, task->tc_SPLower, task->tc_SPUpper, task->tc_SPReg);
- MySetContents(processmoretext3, MUIX_R "%ld\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx", task->tc_Node.ln_Pri, task->tc_SigAlloc, task->tc_SigWait, task->tc_SigRecvd, task->tc_SigExcept, task->tc_Switch, task->tc_Launch, task->tc_MemEntry);
- MySetContents(processmoretext4, MUIX_R "$%04lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx", proc->pr_Pad, proc->pr_GlobVec, proc->pr_Result2, BADDR(proc->pr_COS), BADDR(proc->pr_CLI), proc->pr_WindowPtr);
- MySetContents(processmoretext5, MUIX_R "$%08lx\n%s\n$%08lx\n$%08lx\n$%08lx\n$%08lx", BADDR(proc->pr_SegList), te->te_Num, BADDR(proc->pr_CurrentDir), proc->pr_ConsoleTask, proc->pr_ReturnAddr, BADDR(proc->pr_HomeDir));
- MySetContents(processmoretext6a, MUIX_R "%lD\n$%08lx\n$%08lx\n$%08lx\n$%08lx", proc->pr_StackSize, BADDR(proc->pr_StackBase), BADDR(proc->pr_CIS), proc->pr_FileSystemTask, proc->pr_PktWait);
- MySetContents(processmoretext6b, MUIX_B "$%08lx", proc->pr_Flags);
- MySetContents(processmoretext7, MUIX_R "$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx", proc->pr_ExitCode, proc->pr_ExitData, proc->pr_Arguments, proc->pr_LocalVars, proc->pr_ShellPrivate, BADDR(proc->pr_CES));
-
- NewList((struct List *)&tmplist);
-
- ApplicationSleep(TRUE);
-
- set(seglist, MUIA_NList_Quiet, TRUE);
- DoMethod(seglist, MUIM_NList_Clear);
-
- Forbid();
-
- seg = (LONG *)BADDR((LONG) *((LONG *) (((LONG)BADDR(proc->pr_SegList) + 12))));
- if (!points2ram((APTR)seg)) {
- if (proc->pr_CLI != (BPTR)NULL) {
- seg = (LONG *)BADDR(((struct CommandLineInterface *)BADDR(proc->pr_CLI))->cli_Module);
- }
- }
- if (seg) {
-
- while (seg) {
- if (sle = AllocVec(sizeof(struct SegListEntry), MEMF_PUBLIC)) {
- ULONG size;
-
- size = *(seg - 1);
- _snprintf(sle->sle_Lower, sizeof(sle->sle_Lower), "$%08lx", (ULONG)seg + 4);
- _snprintf(sle->sle_Upper, sizeof(sle->sle_Upper), "$%08lx", (ULONG)seg + size - 4);
- _snprintf(sle->sle_Size, sizeof(sle->sle_Size), "%12lD", size);
-
- AddTail((struct List *)&tmplist, (struct Node *)sle);
- }
-
- seg = (LONG *)BADDR(*seg);
- }
- }
-
- Permit();
-
- ITERATE_CHANGING_LIST(&tmplist, struct SegListEntry *, sle, _sle) {
- InsertBottomEntry(seglist, sle);
- FreeVec(sle);
- }
-
- set(seglist, MUIA_NList_Quiet, FALSE);
-
- ApplicationSleep(FALSE);
-
- set(obj, MUIA_Window_Title, MyGetChildWindowTitle("PROCESS", te->te_Name, tdwd->tdwd_Title, sizeof(tdwd->tdwd_Title)));
- } else {
- APTR add,taskmoretext0,taskmoretext1a,taskmoretext1b,taskmoretext2,taskmoretext3;
-
- Child, add = HGroup,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, MyLabel2 ("Name:"),
- Child, MyLabel2 ("Address:\nIDNestCnt:\nTrapAlloc:\nTrapAble:\nTrapData:\nTrapCode:\nUserData:"),
- Child, MyLabel2 ("Flags:"),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, taskmoretext0 = MyTextObject(),
- Child, HGroup,
- Child, VGroup,
- Child, taskmoretext1a = MyTextObject2(),
- Child, taskmoretext1b = MakeButton(""),
- End,
- Child, MyLabel ("State:\nTDNestCnt:\nExceptData:\nExceptCode:\nStackSize:\nSPLower:\nSPUpper:\nSPReg:"),
- Child, taskmoretext2 = MyTextObject2(),
- Child, MyLabel ("Pri:\nSigAlloc:\nSigWait:\nSigRecvd:\nSigExcept:\nSwitch():\nLaunch():\nMemEntry:"),
- Child, taskmoretext3 = MyTextObject2(),
- End,
- End,
- End;
-
- DoMethod(tdwd->tdwd_MainGroup, OM_ADDMEMBER, add);
- DoMethod(taskmoretext1b, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_TasksDetailWin_TaskFlagsMore);
-
- set(obj, MUIA_Window_ActiveObject, taskmoretext1b);
-
- MySetContents(taskmoretext0, "%s", te->te_Name);
- MySetContents(taskmoretext1a, MUIX_R " $%08lx\n%lD\n$%04lx\n$%04lx\n $%08lx\n $%08lx\n $%08lx", task, task->tc_IDNestCnt, task->tc_TrapAlloc, task->tc_TrapAble, task->tc_TrapData, task->tc_TrapCode, task->tc_UserData);
- MySetContents(taskmoretext1b, MUIX_B "%s", tcflags);
- MySetContents(taskmoretext2, MUIX_C "%s\n" MUIX_R "%lD\n$%08lx\n$%08lx\n%lD\n$%08lx\n$%08lx\n$%08lx", GetTaskState((BYTE)task->tc_State, task->tc_SigWait), task->tc_TDNestCnt, task->tc_ExceptData, task->tc_ExceptCode, (char *)task->tc_SPUpper - (char *)task->tc_SPLower, task->tc_SPLower, task->tc_SPUpper, task->tc_SPReg);
- MySetContents(taskmoretext3, MUIX_R "%ld\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx", task->tc_Node.ln_Pri, task->tc_SigAlloc, task->tc_SigWait, task->tc_SigRecvd, task->tc_SigExcept, task->tc_Switch, task->tc_Launch, task->tc_MemEntry);
-
- set(obj, MUIA_Window_Title, MyGetChildWindowTitle("TASK", te->te_Name, tdwd->tdwd_Title, sizeof(tdwd->tdwd_Title)));
- }
- }
-
- static ULONG __saveds mNew( struct IClass *cl,
- Object *obj,
- struct opSet *msg )
- {
- APTR taskmoregroup;
-
- if (obj = (Object *)DoSuperNew(cl, obj,
- MUIA_HelpNode, TasksText,
- MUIA_Window_ID, MakeID('.','T','A','S'),
- WindowContents, taskmoregroup = HGroup,
-
- End,
- TAG_MORE, msg->ops_AttrList))
- {
- struct TasksDetailWinData *tdwd = INST_DATA(cl, obj);
- APTR parent;
-
- tdwd->tdwd_MainGroup = taskmoregroup;
-
- parent = (APTR)GetTagData(MUIA_Window_ParentWindow, (ULONG)NULL, msg->ops_AttrList);
-
- DoMethod(parent, MUIM_Window_AddChildWindow, obj);
- DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, MUIV_Notify_Application, 5, MUIM_Application_PushMethod, parent, 2, MUIM_Window_RemChildWindow, obj);
- }
-
- return (ULONG)obj;
- }
-
- static ULONG __saveds mDispose( struct IClass *cl,
- Object *obj,
- struct opSet *msg )
- {
- set(obj, MUIA_Window_Open, FALSE);
-
- return (DoSuperMethodA(cl, obj, msg));
- }
-
- static ULONG __saveds mSet( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct TasksDetailWinData *tdwd = INST_DATA(cl, obj);
- struct TagItem *tags, *tag;
-
- for (tags = ((struct opSet *)msg)->ops_AttrList; tag = NextTagItem(&tags); ) {
- switch (tag->ti_Tag) {
- case MUIA_Window_ParentWindow:
- DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, MUIV_Notify_Application, 5, MUIM_Application_PushMethod, (APTR)tag->ti_Data, 2, MUIM_Window_RemChildWindow, obj);
- break;
-
- case MUIA_TasksDetailWin_Task:
- tdwd->tdwd_Task = (struct TaskEntry *)tag->ti_Data;
- SetDetails(cl, obj, (struct TaskEntry *)tag->ti_Data);
- break;
- }
- }
-
- return (DoSuperMethodA(cl,obj,msg));
- }
-
- static ULONG __saveds mTaskFlagsMore( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct TasksDetailWinData *tdwd = INST_DATA(cl, obj);
- APTR flagsWin;
-
- if (flagsWin = FlagsWindowObject,
- MUIA_Window_Title, "Task Flags",
- MUIA_Window_ParentWindow, obj,
- End) {
- DoMethod(flagsWin, MUIM_FlagsWin_ShowFlags, tdwd->tdwd_Task->te_Addr->tc_Flags, MUIV_FlagsWin_FlagsType_Byte, taskFlags, NULL, "tc_Flags");
- }
-
- return 0;
- }
-
- static ULONG __saveds mProcessFlagsMore( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct TasksDetailWinData *tdwd = INST_DATA(cl, obj);
- APTR flagsWin;
-
- if (flagsWin = FlagsWindowObject,
- MUIA_Window_Title, "Process Flags",
- MUIA_Window_ParentWindow, obj,
- End) {
- DoMethod(flagsWin, MUIM_FlagsWin_ShowFlags, ((struct Process *)tdwd->tdwd_Task->te_Addr)->pr_Flags, MUIV_FlagsWin_FlagsType_Long, processFlags, NULL, "pr_Flags");
- }
-
- return 0;
- }
-
- ULONG __asm __saveds TasksDetailWinDispatcher( register __a0 struct IClass *cl,
- register __a2 Object *obj,
- register __a1 Msg msg )
- {
- switch (msg->MethodID) {
- case OM_NEW: return (mNew(cl, obj, (APTR)msg));
- case OM_DISPOSE: return (mDispose(cl, obj, (APTR)msg));
- case OM_SET: return (mSet(cl, obj, (APTR)msg));
- case MUIM_TasksDetailWin_TaskFlagsMore: return (mTaskFlagsMore(cl, obj, (APTR)msg));
- case MUIM_TasksDetailWin_ProcessFlagsMore: return (mProcessFlagsMore(cl, obj, (APTR)msg));
- }
-
- return (DoSuperMethodA(cl, obj, msg));
- }
-
-